\section*{Rohdaten Mediathek}
\subsection*{Aufgabenstellung}
Eine iTunes-Mediathek ist gegeben, in der die Track- und
Playlistinformationen in generischen Tags integriert sind und dadurch
ihre semantische Bedeutung verlieren. Erst in Kombination mit
umliegenden Werten ergeben die Tags wieder einen Sinn und können
weiterverarbeitet werden. Tiefe und Position der Tags spielen dabei
eine wichtige Rolle.\\
Der Inhalt der Aufgabe besteht nun darin, die generischen
Informationsträger durch aussagekräftige Tags zu ersetzen.

\subsection*{Lösungsansatz}
In dieser Aufgabe kommt XSLT zum Einsatz, weil es sich hierbei um die
Transformation einer XML-Datenbasis handelt. Die Struktur des
Datenbestandes sieht folgendermaßen aus:\\
\begin{lstlisting}[caption=Repräsentation der Mediathek im Datenbestand]
<plist>
	<dict>
		<key>key</key><type>value</type>
		...
		<key>Tracks</key>
		<dict>
			<key>TrackID</key>
			<dict>
				<key>key</key><type>value</type>
				...
			</dict>
			...
		</dict>
		<key>Playlists</key>
		<array>
			<dict>
				<key></key><value></value>
				...
				<key>Playlist Items</key>
				<array>
					<dict>
						<key>Track ID</key><type>value</type>
					</dict>
					...
				</array>
			</dict>
			...
		</array
	</dict>
</plist>
\end{lstlisting}
Um eine bessere Struktur zu erreichen und den Tags mehr
Beschreibungskraft zu verleihen haben wir die semantische Bedeutung
der Tags aufgeschlüsselt, zusammengefasst und eine neue Struktur
definiert. Diese sieht folgendermaßen aus:\\
\begin{lstlisting}[caption={Neue Repräsentation der Mediathek}]
<Mediathek>
	<MetaData>
		<key type="type">value</key>
		...
	</MetaData>
	<TrackArea>
		<Track>
			<key type="type">value</key>
			...
		</Track>
		...
	</TrackArea>
	<Playlists>
		<Playlist>
			<key type="type">value</key>
			...
			<PlaylistItems>
				<TrackIDRef type="integer">TrackID</TrackIDRef>
				...
			</PlaylistItems>
		</Playlist>
		...
	</Playlists>
</Mediathek>
\end{lstlisting}

\subsection*{Lösung}
Die Lösung besteht aus zwei Templates. Das erste Template dient der
Traversierung der Struktur um gewisse Stellen aufzufinden. Das zweite
Template dient dazu um \texttt{<key>key</key><type>value</type>} nach
\texttt{<key type="type">value</key>} zu übersetzen.\\
\lstinputlisting[caption=Extrahiere Metadaten, firstnumber=19,
linerange=19-26]{../Rohdaten_Mediathek/Mediathek.xslt} Der Code im
obigen Listing sucht nach allen Key-Tags im ersten plist-Objekt und
schreibt diese in den Metadata-Container. Die
\texttt{for-each}-Schleife traversiert alle Key-Tags mit Ausnahme von
denen, welche Tracks und Playlist als \texttt{text()}-Node
enthalten. Das garantiert, dass nur Metadaten in die Metadata-Sektion
aufgenommen werden.

In Zeile 23 wird \texttt{apply-templates} angewandt um die Key-Tags zu
konvertieren.\\

\lstinputlisting[caption=Extrahiere Tracks, firstnumber=28,
linerange=28-37]{../Rohdaten_Mediathek/Mediathek.xslt} Der Code in
diesem Listing traversiert alle Tracks und füllt den
TrackArea-Container. Dazu werden alle Key-Tags innerhalb von
\texttt{dict/dict} selektiert, von denen das Vorgänger-Key-Element
\glqq{}Tracks\grqq{} war. Dadurch werden nur Tracks aufgenommen. Für
jedes Key-Value-Paar innerhalb von Tracks wird nun die
\texttt{apply-templates}-Methode angewandt um sie zu konvertieren.\\

\lstinputlisting[caption=Extrahiere Playlists, firstnumber=39,
linerange=39-58]{../Rohdaten_Mediathek/Mediathek.xslt} Zeile 40
traversiert alle dict-Elemente Unterhalb eines Key-Elements mit dem
Inhalt Playlists. Zeile 42 traversiert alle Key-Tags innerhalb dieses
dict-Elements, dies sind die Metadaten der Playlist. Zeile 47
traversiert dann alle integer-Elemente innerhalb des Key-Tags mit
Namen PlaylistItems und schreibt diese als TrackIDRef-Elemente in den
PlaylistItems-Container, dies sind die Referenzen auf die Tracks der
Playlist.\\

\lstinputlisting[caption=Konvertierung der Key-Value-Paare,
firstnumber=63, linerange=63-82]{../Rohdaten_Mediathek/Mediathek.xslt}
Dieses Template ist für die Konvertierung von
\texttt{<key>key</key><type>value</type>} nach\\ \texttt{<key
  type="type>value</key>} zuständig. Das \texttt{xsl:when} in Zeile 67
überprüft ob es sich beim Typ um einen boolschen Wert handelt. Dieser
muss separat behandelt werden, da er im alten Datenbestand als
\texttt{<true/>} geführt wird. Ab Zeile 74 wird die Transformierung
aller anderen Key-Tags durchgeführt. Wichtig dabei ist, dass mittels
\texttt{translate(\$tagName, ' ', '')} alle Abstandszeichen aus dem
neuen Tag-Namen entfernt werden.

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../documentation"
%%% End: 
